package com.neusoft.exercise;

import java.util.Scanner;

public class HomeWorkMethod {

	public static void main(String[] args) {
		// 1.调用阶乘
		long fac = factorial(5);
		// 输出阶乘结果
		System.out.println("5的阶乘为" + fac);

		// 2.
		// 定义变量
		int iYear;
		System.out.println("请输入待判断的年份");
		iYear = ScanInt();
		isLeap(iYear);
		
		//3.找最小质数
		int val01 = 200;
		findMinPrime(val01);
		
		//4.数组和冒泡排序
		int[] arr01 = new int[] {1,2,6,232,11,324,54,11,78};
		bubbleSort2(arr01);

	}

	/*-
	 * indent
	 * 4.写一个方法，功能：定义一个一维的int 数组，
	 * 长度任意, 然后将它们按从小到大的顺序输出（使用冒泡排序） 
	 * （知识点：方法的定义和访问）。[选做题]
	 */
	private static void bubbleA() {
		int leng = 200;
		int[] arr2 = new int[leng];
		// 定义一个数组 ，赋随机数
		for (int i = 0; i < arr2.length; i++) {

			arr2[i] = (int) (Math.random() * 3000);
		}
		//
		System.out.println("冒泡排序");
		print1DArray(arr2);
		bubbleSort2(arr2);
		print1DArray(arr2);
	}

	// 冒泡排序
	private static void bubbleSort2(int[] array) {
		// 输出提示程序开始
		System.out.println("begin bubble sort2：");
		// 定义最大值
		int max = 0;
		// 定义循环因子
		int i, j, k;
		// 统计交换次数
		int count = 0;
		// 标志位，判断是否有序（如果本轮循环中没有发生交换为有序）
		boolean isSorted;
		// for循环执行
		for (i = 0; i < array.length; i++) {
			// 设有序
			isSorted = true;
			for (j = 0; j < array.length - i - 1; j++) {
				// 如果下标为j的数比j+1大 ，交换两个数
				if (array[j] > array[j + 1]) {
					k = array[j + 1];
					array[j + 1] = array[j];
					array[j] = k;
					// 如果发生交换，证明数列还不是有序的
					isSorted = false;
					count++;
				}
			}
			// 退出内层循环后，判断是否有序
			if (isSorted) {
				break;
			}
		}
		System.out.println("bubble2比较次数为" + count);
	}

	/**
	 * 3 找大于200的最小质数
	 */
	private static void findMinPrime(int iNumber) {
		
		// 定义质数变量
		int iPrime;
		// 定义自增变量
		int iTemp;
		// 定义一个标志记录是否为质数 true为质数，false为合数
		boolean bflag;
		
		// System.out.println("iNumber=" + iNumber);
		// iNumber赋给中间变量
		iTemp = iNumber;
		// 测试赋值是否正确
		// System.out.println("iTemp=" + iTemp);
		while (true) {
			//System.out.println("--while循环开始--");
			// 为新的数值充值标志为真，即默认这个数是质数
			bflag = true;
			// 质数的判断方法，循环2到数值的平方根的整数，如果能被整除为合数，都不能整除为质数
			for (int i = 2; i <= Math.sqrt(iTemp); i++) {
				if (iTemp % i == 0) {
					// 能被2-平方根内任意一个数整除，都不是质数
					// 修改标志为false ，此数非质数
					bflag = false;
					// 能被整除就直接跳出for循环，执行下面的语句
					break;
				}
			}
			// 如果标志位为false，则输出XX不是质数，重新开始新的一轮while循环
			// 如果标志位仍为true，则输出是大于XX的最小质数，并退出while循环，程序结束
			if (bflag == false) {
				//System.out.println(iTemp + "不是质数");
				iTemp++;
				//System.out.println("--while循环分支结束--");
				continue;
			} else if (bflag == true) {
				// 这句话多余，为了变量清晰，没有修改
				iPrime = iTemp;
				// 输出最小质数的信息
				System.out.println(iPrime + "是大于" + iNumber + "的最小质数");
				//System.out.println("程序运行结束");
				// 退出while循环
				break;
			}
		}

	}

	/**
	 * 2.编写一个方法，判断该年份是平年还是闰年
	 */
	private static void isLeap(int iYear) {
		//判断
		boolean isLeapYear=true;
		// 闰年的两个计算方法 1.整除100且整除400 如2000年
		if (iYear % 100 == 0 && iYear % 400 == 0) {
			
			isLeapYear=true;
			// 2.不能整除100但能整除4的年份 如2004
		} else if (iYear % 100 != 0 && iYear % 4 == 0) {
			isLeapYear=true;
		} else {
			isLeapYear=false;
			System.out.println();
		}
		
		if(isLeapYear) {
			System.out.println(iYear + "年是闰年");
			
		}else {
			System.out.println(iYear+"年不是闰年");
		}

	}

	/**
	 * 8 循环输出一定范围内的闰年
	 */
	private static void judgeLeapYear() {
		// 起始年
		int iYear0;
		// 终止年
		int iYearn;
		// 定义一个中间变量
		int iYear;
		// 统计计算出的闰年个数
		int inum = 0;
		// 给两个变量赋值
		System.out.println("请输入待查询闰年的起始年份：");
		iYear0 = ScanInt();
		System.out.println("请输入待查询闰年的终止年份");
		iYearn = ScanInt();
		// 将初始年份赋给iYear
		iYear = iYear0;
		// 输出查询信息
		System.out.println("从" + iYear0 + "年到" + iYearn + "年查询闰年：");
		// 当iYear小于iYearn是一直循环
		while (iYear <= iYearn) {
			// 闰年的两个计算方法 1.整除100且整除400 如2000年
			if (iYear % 100 == 0 && iYear % 400 == 0) {
				inum++;
				iYear += 4;
				System.out.println(iYear + "年是闰年");
				// 2.不能整除100但能整除4的年份 如2004
			} else if (iYear % 100 != 0 && iYear % 4 == 0) {
				inum++;
				iYear += 4;
				System.out.println(iYear + "年是闰年");
			} else {

				// 自增，计算下一年，当iYear>iYearn成为循环结束条件
				iYear++;
			}

		}
		// 根据统计的闰年个数，如果计数为0 ，输出提示信息
		if (inum == 0) {
			System.out.println("从" + iYear0 + "年到" + iYearn + "年之间没有闰年");
		}

	}

	// 阶乘
	/**
	 * 编写一个方法，求整数n的阶乘，例如5的阶乘是1*2*3*4*5 1-2 for循环求阶乘
	 */
	private static void forFactor() {
		// 求阶乘的数
		int iNumber = 0;
		// 阶乘
		int iFactor = 1;
		// 退出
		String sexit;
		// 一直循环计算阶乘
		while (true) {
			// 提示输入
			System.out.println("请输入需要计算阶乘的正整数：");
			iNumber = ScanInt();
			// 每次循环重新初始化iFactor
			iFactor = 1;
			// 如果输入数为负数，跳出本轮循环
			if (iNumber < 0) {
				System.out.println("输入错误");
				continue;
			}
			if (iNumber == 0) {
				iFactor = 1;
			} else if (iNumber == 1) {
				iFactor = 1;
			} else if (iNumber >= 2) {

				for (int iTemp = iNumber; iTemp > 1; iTemp--) {
					iFactor *= iTemp;
					// 测试数据是否正确
					// System.out.println(iFactor);
				}
			}
			System.out.println(iNumber + "的阶乘为" + iFactor);
			// 退出
			// System.out.println("-----------------------------");
			System.out.println("如果退出请输入exit，不退出请按任意键并回车");
			sexit = scanStr();
			if (sexit.equals("exit")) {
				System.out.println("程序结束");
				System.out.println("-----------------------------");
				break;
			} else {
				System.out.println("继续运行");
				System.out.println("-----------------------------");
			}

		}

	}

	/**
	 * 1-1编写一个方法，求整数n的阶乘，例如5的阶乘是1*2*3*4*5 递归求阶乘
	 */
	private static void recursive() {
		// 求阶乘的数
		int iNumber = 0;
		// 阶乘
		long iFactor;
		// 退出
		String sexit;
		// 一直循环计算阶乘
		while (true) {

			System.out.println("请输入需要计算阶乘的正整数：");
			iNumber = ScanInt();
			if (iNumber < 0) {
				System.out.println("输入错误");
				continue;
			}
			iFactor = factorial(iNumber);
			if (iFactor >= 1) {
				System.out.println(iNumber + "的阶乘为" + iFactor);

			} else if (iFactor == 0) {
				System.out.println("阶乘计算错误，请重新计算");
			}
			// 退出
			// System.out.println("-----------------------------");
			System.out.println("如果退出请输入exit，不退出请按任意键并回车");
			sexit = scanStr();
			if (sexit.equals("exit")) {
				System.out.println("程序结束");
				System.out.println("-----------------------------");
				break;
			} else {
				System.out.println("继续运行");
				System.out.println("-----------------------------");
			}

		}
	}

	/**
	 * 递归求阶乘的阶乘函数
	 * 
	 * @param iNumber
	 * @return iFactor 好像0的阶乘也是1？
	 */
	private static long factorial(int iNumber) {
		long iFactor = 1;
		if (iNumber > 1) {
			iFactor = iNumber * factorial(iNumber - 1);
		} else if (iNumber == 1) {
			iFactor = 1;
		} else if (iNumber == 0) {
			iFactor = 1;
		} else {
			iFactor = 0;
		}
		return iFactor;
	}

	/**
	 * f辅助方法
	 */
	/**
	 * 
	 */
	private static int ScanInt() {

		int iValue = 0;
		Scanner sc = new Scanner(System.in);
		// System.out.println("please input a number:");
		while (true) {
			try {
				iValue = sc.nextInt();
				// System.out.println("input="+iValue);
				break;
			} catch (Exception e) {
				System.out.println("输入错误，请重新输入：");
				sc.nextLine();
			}

		}
		return iValue;
	}

	/**
	 * 
	 */
	private static String scanStr() {

		String sValue;
		Scanner sc = new Scanner(System.in);
		System.out.println("please input:");
		while (true) {
			try {

				sValue = sc.nextLine();
				break;

			} catch (Exception e) {
				System.out.println("input again：");
				sc.nextLine();
			}

		}
		return sValue;
	}

	/**
	 * 
	 */

	// 定义打印一维数组的方法-整型
	private static void print1DArray(int[] array) {
		// 输出提示信息
		System.out.println("==打印数组==");
		// 遍历输出数组
		// System.out.println("排序后数组为：");
		for (int i = 0; i < array.length; i++) {
			System.out.print(array[i] + "  ");
		}
		System.out.println();
	}
}
